package org.dxy.trigger.http;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dxy.api.dto.request.materialGroup.CreateMaterialGroupRequest;
import org.dxy.api.dto.request.materialGroup.UpdateMaterialGroupRequest;
import org.dxy.api.dto.response.R;
import org.dxy.infrastructure.persistent.po.query.MaterialGroupViewPo;
import org.dxy.trigger.http.service.MaterialGroupApplicationService;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 物料群组管理控制器
 * @author dxy
 * @createTime 2025/9/5
 */
@Slf4j
@RestController
@RequestMapping("/api/materialGroups")
@RequiredArgsConstructor
public class MaterialGroupController {

    private final MaterialGroupApplicationService materialGroupApplicationService;

    /**
     * @description 创建物料群组
     * @param request 包含群组创建信息的请求DTO
     * @return 返回创建成功的群组ID
     * @date 2025/9/5 20:01
     * @auther dxy
     */
    @PostMapping("/create")
    public R<Long> createMaterialGroup(@Validated @RequestBody CreateMaterialGroupRequest request) {
        return materialGroupApplicationService.create(request);
    }

    /**
     * @description 分页查询物料群组列表（支持条件过滤）
     * @param page 分页参数（页码、每页大小等）
     * @param query 过滤条件（群组名称、状态、类型等）
     * @return 分页的群组列表响应
     * @date 2025/9/5 20:01
     * @auther dxy
     */
    @GetMapping("/list")
    public R<Page<MaterialGroupViewPo>> list(
            @ParameterObject Page<MaterialGroupViewPo> page,
            @ParameterObject MaterialGroupViewPo query) {
        return materialGroupApplicationService.list(page, query);
    }

    /**
     * @description 更新物料群组信息
     * @param id 群组ID
     * @param request 包含更新信息的请求DTO
     * @return 返回更新成功或失败的响应
     * @date 2025/9/5 20:01
     * @auther dxy
     */
    @PutMapping("/{id}")
    public R<Void> update(@PathVariable Long id, @Validated @RequestBody UpdateMaterialGroupRequest request) {
        return materialGroupApplicationService.update(id, request);
    }

    /**
     * @description 删除单个物料群组
     * @param id 群组ID
     * @return 返回删除成功或失败的响应
     * @date 2025/9/5 20:01
     * @auther dxy
     */
    @DeleteMapping("/{id}")
    public R<Void> delete(@PathVariable Long id) {
        return materialGroupApplicationService.delete(id);
    }

    /**
     * @description 批量删除物料群组
     * @param ids 群组ID列表
     * @return 返回批量删除成功或失败的响应
     * @date 2025/9/5 20:01
     * @auther dxy
     */
    @DeleteMapping("/batch")
    public R<Void> batchDelete(@RequestBody List<Long> ids) {
        return materialGroupApplicationService.batchDelete(ids);
    }

    /**
     * @description 获取物料群组详情
     * @param id 群组ID
     * @return 返回群组详情信息
     * @date 2025/9/5 20:01
     * @auther dxy
     */
    @GetMapping("/{id}")
    public R<MaterialGroupViewPo> getById(@PathVariable Long id) {
        return materialGroupApplicationService.getById(id);
    }

    /**
     * @description 启用物料群组
     * @param id 群组ID
     * @return 返回操作结果
     * @date 2025/9/5 20:01
     * @auther dxy
     */
    @PutMapping("/{id}/enable")
    public R<Void> enable(@PathVariable Long id) {
        return materialGroupApplicationService.enable(id);
    }

    /**
     * @description 禁用物料群组
     * @param id 群组ID
     * @return 返回操作结果
     * @date 2025/9/5 20:01
     * @auther dxy
     */
    @PutMapping("/{id}/disable")
    public R<Void> disable(@PathVariable Long id) {
        return materialGroupApplicationService.disable(id);
    }



    /**
     * @description 根据群组类型获取群组列表
     * @param groupType 群组类型
     * @return 返回指定类型的群组列表
     * @date 2025/9/5 20:01
     * @auther dxy
     */
    @GetMapping("/type/{groupType}")
    public R<List<MaterialGroupViewPo>> getByGroupType(@PathVariable String groupType) {
        return materialGroupApplicationService.getByGroupType(groupType);
    }

    /**
     * @description 获取启用状态的群组列表
     * @return 返回启用状态的群组列表
     * @date 2025/9/5 20:01
     * @auther dxy
     */
    @GetMapping("/active")
    public R<List<MaterialGroupViewPo>> getActiveGroups() {
        return materialGroupApplicationService.getActiveGroups();
    }
}